package cn.tang.tframe.common.utils.thread;

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * Created by tanghc on 17/2/20.
 */
public class ExecutorFactory {

	private static final ThreadFactory DEFAULT_THREAD_FACTORY = new NamedThreadFactory("QTFRAME-defaultThreadFactory", true);

	private ExecutorFactory() {
	}

	public static ThreadPoolExecutor newFixedThreadPool(int nThreads, int workQueueMaxSize, ThreadFactory threadFactory) {
		return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(workQueueMaxSize), threadFactory);
	}

	public static ThreadPoolExecutor newFixedThreadPool(int nThreads, int workQueueMaxSize) {
		return newFixedThreadPool(nThreads, workQueueMaxSize, DEFAULT_THREAD_FACTORY);
	}

	public static ThreadPoolExecutor newFixedThreadPool(int nThreads, int workQueueMaxSize, String threadFactoryName, boolean daemon) {
		ThreadFactory threadFactory = new NamedThreadFactory(threadFactoryName, daemon);
		return newFixedThreadPool(nThreads, workQueueMaxSize, threadFactory);
	}

}